import axios from 'axios'

// 克隆对象并设置基地址
const request = axios.create({
    // baseURL: 'http://toutiao.itheima.net/'
    baseURL: 'http://geek.itheima.net/'
})

import store from '@/store'
import router from '@/router'
import { Toast } from 'vant'
// 请求拦截要加给request,因为我们项目中的请求都是由request发的
request.interceptors.request.use(function(config) {

        // 如果有token我才加token,没有token就不加了
        if (store.state.tokenObj.token) {
            // 添加token到headers,注意Bearer后面要有一个空格的!
            config.headers.Authorization = 'Bearer ' + store.state.tokenObj.token
        }

        return config

    }, function(error) {

        return Promise.reject(error)
    })
    // 添加响应拦截
request.interceptors.response.use(function(response) {

    //   对响应数据做点什么
    return response

}, async function(error) {
    // 先判断是不是401错误,error就是错误信息对象
    if (error.response.status === 401) {

        // 利用refresh_token去获取最新token
        // 所以发请求
        // 这里不能用request对象发请求
        // 因为用request会触发请求拦截，所以明明我在这里加了refresh_token
        // 但是触发请求拦截后，会用过期的token把refresh_token给覆盖了，所以服务器报500错误
        // 所以一朝回到解放前，用axios发即可
        // 但是用axios要设置完整的地址，因为axios没有配置基地址
        try {
            let res = await axios({
                url: 'http://toutiao.itheima.net/v1_0/authorizations',
                method: 'put',
                headers: {
                    Authorization: 'Bearer ' + store.state.tokenObj.refresh_token
                }
            })

            // 请求到后，再把新的token存到vuex和本地存储
            // 这里不能直接存res.data.data，因为这里只有token
            // 如果你直接存了就会把我们的refresh_token弄没了
            // 所以我们需要手动写一个对象，里面包含token和之前的refresh_token
            store.commit('changeToken', {
                    token: res.data.data.token,
                    refresh_token: store.state.tokenObj.refresh_token

                })
                // error.config就有之前访问页面要发请求的相关信息，利用它重新发一次再把结果返回即可
                // 需要再把原本你失败的请求利用最新token再发一次即可
                // 我特意用request再发的请求，那么又会触发它的请求拦截
                // 请求拦截里自动用上最新的token来发了
            return request(error.config)
        } catch {

            // 能来到这，只能证明利用refresh_token去刷新时也报错了
            // 那就肯定就是refresh_token有问题，所以就该回到登录页
            // 让它重新登录
            // 路由跳转到登录页
            router.push('/login')
                // 弹出轻提示
            Toast.fail('登录状态失效,请重新登录')
            return Promise.reject(error);


        }
    }
    return Promise.reject(error)
})

// 暴露出去
export default request